package com.mayfool.gitmanager.ui.panel;

import com.mayfool.gitmanager.core.entity.ProjectInfo;
import com.mayfool.gitmanager.core.entity.TaskInfo;
import com.mayfool.gitmanager.core.helper.GitOperations;
import com.mayfool.gitmanager.core.manager.TaskManager;
import com.mayfool.gitmanager.core.helper.LogHelper;
import com.mayfool.gitmanager.ui.DirChooser;
import com.mayfool.gitmanager.ui.ProjectChooser;
import com.mayfool.gitmanager.ui.dialog.BranchCreateDialog;
import com.mayfool.gitmanager.ui.dialog.BranchDeleteDialog;

import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.util.List;
import java.util.Set;

/**
 * @author zhou.xu
 * @description: 工作区面板
 * 用于显示和管理当前任务的工作空间、项目列表和Git操作
 * 包含工作空间选择、项目添加、分支切换等功能
 * @since 2025/3/10 22:35
 */
public class WorkspacePanel extends JPanel {

    /**
     * 当前任务信息
     */
    private TaskInfo task;

    /**
     * Git操作辅助类
     */
    private GitOperations gitOps;

    /**
     * 项目列表数据模型
     */
    private DefaultListModel<String> listModel;

    /**
     * 项目列表显示控件
     */
    private JList<String> projectList;

    /**
     * 工作空间选择器
     */
    private DirChooser workspaceChooser;

    /**
     * 项目选择器
     */
    private ProjectChooser projectChooser;

    /**
     * 切换分支按钮
     */
    private JButton switchBranchBtn;

    /**
     * 创建分支按钮
     */
    private JButton createBranchBtn;

    /**
     * 合并分支按钮
     */
    private JButton mergeBranchBtn;

    /**
     * 初始化工作空间按钮
     */
    private JButton initWorkspaceBtn;

    /**
     * 构造函数
     * @param task 任务信息，如果为null则创建新的任务
     */
    public WorkspacePanel(TaskInfo task) {
        super(new BorderLayout());
        if (task == null) {
            this.task = new TaskInfo();
            gitOps = new GitOperations(new File(""));
        } else {
            this.task = task;
            gitOps = new GitOperations(new File(task.getWorkspacePath()));
        }
        initComponents();
        setupEventListeners();
        setupLayout();
    }

    /**
     * 初始化UI组件
     */
    private void initComponents() {
        workspaceChooser = new DirChooser("选择工作空间");
        projectChooser = new ProjectChooser("添加项目");
        switchBranchBtn = new JButton("切换分支");
        createBranchBtn = new JButton("创建分支");
        mergeBranchBtn = new JButton("合并分支");
        initWorkspaceBtn = new JButton("初始化工作空间");
        listModel = new DefaultListModel<>();
        projectList = new JList<>(listModel);
    }

    /**
     * 设置事件监听器
     * 处理各种UI组件的事件
     */
    private void setupEventListeners() {
        // 项目选择器变更事件
        projectChooser.addChangeListener(e -> {
            List<ProjectInfo> projectInfos = projectChooser.getProjectInfos();
            for (ProjectInfo project : projectInfos) {
                task.getProjects().add(project);
                // 在新线程中克隆项目
                new Thread(() -> {
                    gitOps.cloneFromLocal(project.getLocalPath());
                    refreshView();
                }).start();
            }
            TaskManager.saveTasksToJson();
        });

        // 切换分支按钮点击事件
        switchBranchBtn.addActionListener(e -> {
            String branch = JOptionPane.showInputDialog(this, "请输入目标分支名称", task.getDevelopBranch());
            if (branch != null && !branch.trim().isEmpty()) {
                new Thread(() -> {
                    gitOps.switchBranchForAll(branch);
                }).start();
            }
        });

        // 合并分支按钮点击事件
        mergeBranchBtn.addActionListener(e -> {
            String branch = JOptionPane.showInputDialog(this, "请输入要合并的分支名称");
            if (branch != null && !branch.trim().isEmpty()) {
                new Thread(() -> {
                    gitOps.mergeBranches(branch);
                }).start();
            }
        });

        // 初始化工作空间按钮点击事件
        initWorkspaceBtn.addActionListener(e -> {
            Set<ProjectInfo> projectInfos = task.getProjects();
            for (ProjectInfo project : projectInfos) {
                new Thread(() -> {
                    gitOps.cloneFromLocal(project.getLocalPath());
                    refreshView();
                }).start();
            }
        });

        // 创建分支按钮点击事件
        createBranchBtn.addActionListener(e -> {
            if (task != null) {
                BranchCreateDialog dialog = new BranchCreateDialog(
                        (Frame) SwingUtilities.getWindowAncestor(this),
                        task,
                        gitOps
                );
                dialog.setVisible(true);
            }
        });
    }

    /**
     * 设置面板布局
     * 使用BorderLayout组织各个组件
     */
    private void setupLayout() {
        // 顶部面板：包含工具按钮
        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 6, 5));
        topPanel.add(new JLabel("工作空间:"));
        topPanel.add(workspaceChooser);
        topPanel.add(projectChooser);
        topPanel.add(switchBranchBtn);
        topPanel.add(createBranchBtn);
        topPanel.add(mergeBranchBtn);
        topPanel.add(initWorkspaceBtn);

        // 中央面板：显示项目列表
        JPanel centerPanel = new JPanel(new BorderLayout());
        centerPanel.add(new JScrollPane(projectList), BorderLayout.CENTER);

        // 工作区面板：组合顶部和中央面板
        JPanel workspacePanel = new JPanel(new BorderLayout());
        workspacePanel.add(topPanel, BorderLayout.NORTH);
        workspacePanel.add(centerPanel, BorderLayout.CENTER);
        add(workspacePanel, BorderLayout.CENTER);

        refreshView();
    }

    /**
     * 切换当前任务
     * @param task 新的任务信息，可以为null表示清空当前任务
     * @author zhou.xu
     * @date 2024-03-18 11:40:00
     */
    public void changeTask(TaskInfo task) {
        this.task = task;
        gitOps = task != null ? new GitOperations(new File(task.getWorkspacePath())) : new GitOperations(new File(""));
        refreshView();
        
        // 根据任务状态更新UI组件的可用性
        switchBranchBtn.setEnabled(task != null);
        createBranchBtn.setEnabled(task != null);
        mergeBranchBtn.setEnabled(task != null);
        initWorkspaceBtn.setEnabled(task != null);
    }

    /**
     * 刷新视图
     * 更新工作空间路径和项目列表显示
     */
    private void refreshView() {
        workspaceChooser.setDir(task != null ? task.getWorkspacePath() : "");
        listModel.clear();
        if (task != null && task.getProjects() != null) {
            for (ProjectInfo project : task.getProjects()) {
                listModel.addElement(project.getName());
            }
        }
    }

    /**
     * 处理任务删除
     * 根据用户选择删除关联的Git分支和工作空间目录
     *
     * @param task 要删除的任务
     * @param deleteBranch 是否删除关联的Git分支
     * @param deleteWorkspace 是否删除工作空间目录
     * @author zhou.xu
     * @date 2024-03-18 12:00:00
     */
    public void handleTaskDeletion(TaskInfo task, boolean deleteBranch, boolean deleteWorkspace) {
        if (task == null || task.getProjects() == null) return;

        // 获取工作空间目录
        File workspaceDir = new File(task.getWorkspacePath());

        // 删除任务分支
        if (deleteBranch) {
            handleBranchDeletion(task);
        }

        // 删除工作空间目录
        if (deleteWorkspace && workspaceDir.exists()) {
            try {
                deleteDirectory(workspaceDir);
                LogHelper.getInstance()
                    .append("已删除工作空间目录: ")
                    .append(workspaceDir.getAbsolutePath())
                    .append("\n");
            } catch (Exception e) {
                LogHelper.getInstance()
                    .append("删除工作空间目录失败: ")
                    .append(e.getMessage())
                    .append("\n");
            }
        }
    }

    /**
     * 处理任务删除
     * 显示分支删除确认对话框，并在完成后刷新任务列表
     *
     * @param task 任务信息
     * @author zhou.xu
     * @date 2024-03-18 13:30:00
     */
    public void handleBranchDeletion(TaskInfo task) {
        if (task == null) {
            LogHelper.getInstance().error("无法删除任务：任务对象为空");
            return;
        }

        // 删除开发分支
        String branchToDelete = task.getDevelopBranch();

        // 显示分支删除对话框
        BranchDeleteDialog dialog = new BranchDeleteDialog(
                (Frame) SwingUtilities.getWindowAncestor(this),
                task,
                gitOps,
                branchToDelete
        );
        dialog.setVisible(true);
    }

    /**
     * 递归删除目录
     *
     * @param directory 要删除的目录
     */
    private void deleteDirectory(File directory) {
        if (directory.exists()) {
            File[] files = directory.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        deleteDirectory(file);
                    } else {
                        file.delete();
                    }
                }
            }
            directory.delete();
        }
    }
}
